home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / detaz / execle.c < prev    next >
C/C++ Source or Header  |  1995-04-27  |  1KB  |  71 lines

  1. #include <stddef.h>
  2. #include <osbind.h>
  3. #include <mintbind.h>
  4. #include <basepage.h>
  5. #include <stdarg.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. long execle(char *prg,...)
  10. {
  11.     va_list        args;
  12.     char        *old_env = _pbase->p_env;
  13.     char        *new_env;
  14.     char        buf[256];
  15.     char        *p,*q;
  16.     size_t        size,work;
  17.  
  18.     size = strlen(prg)+1;
  19.     va_start(args,prg);
  20.     while(p=va_arg(args,char *))
  21.         size += strlen(p+1);
  22.     va_end(args);
  23.  
  24.     size+=6;
  25.     p = old_env;
  26.  
  27.     while(*p)
  28.         p+=strlen(p)+1;
  29.     size += (p-old_env)+1;
  30.     if(size & 1) ++size;
  31.     if((new_env=malloc(size))==NULL)
  32.         exit(-100);
  33.     p = old_env;
  34.     q = new_env;
  35.  
  36.     while(*p)
  37.     {
  38.         while(*q++=*p++) ;
  39.     }
  40.     p = "ARGV=";
  41.     while(*q++=*p++);
  42.     p = prg;
  43.     while(*q++=*p++);
  44.     
  45.     va_start(args,prg);
  46.     while(p=va_arg(args,char *))
  47.     {
  48.         while(*q++ = *p++ );
  49.     }
  50.     *q++ = '\0';
  51.     *q = '\0';
  52.     va_end(args);
  53.  
  54.     size = 0;
  55.     p = buf+1;
  56.     va_start(args,prg);
  57.     while(q=va_arg(args,char *))
  58.     {
  59.         work = strlen(q)+1;
  60.         if((size+work)>125)
  61.             break;
  62.         while(*p++ = *q++) ;
  63.         *p++ = ' ';
  64.         size+=work;
  65.     }
  66.     p[-1]='\0';
  67.     buf[0] = 127;
  68.     if(size=Pexec(200,prg,buf,new_env))
  69.         return size;
  70. }
  71.